package com.fz.service.system.impl;

import com.fz.common.ResponseEntity;
import com.fz.dto.system.menu.MenuAdd;
import com.fz.dto.system.menu.MenuQuery;
import com.fz.dto.system.menu.MenuUpd;
import com.fz.entity.system.Menu;
import com.fz.mapper.system.MenuMapper;
import com.fz.service.system.MenuService;
import com.fz.vo.system.menu.MenuTreeVo;
import com.fz.vo.system.menu.MenuVo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
@SuppressWarnings("unchecked")
public class MenuServiceImpl implements MenuService {

    @Resource
    private MenuMapper menuMapper;

    /**
     * @方法描述: 目录查询
     * @参数:
     * @返回值:
     * @创建人: shy
     * @创建时间:: 2021/3/18
     */
    @Override
    public ResponseEntity<MenuTreeVo> findMenu(MenuQuery menuQuery) {
        List<MenuVo> menuVoList = menuMapper.findMenuVoList(menuQuery);
        MenuTreeVo menuTreeVo = buildTree(menuVoList);
        return ResponseEntity.buildSuccess(menuTreeVo);

    }



    /**
     * @方法描述: 增加菜单目录
     * @参数:
     * @返回值:
     * @创建人:
     * @创建时间:: 2021/3/19
     */
    @Override
    public ResponseEntity addMenu(MenuAdd menuAdd) {
        Menu menu = new Menu();
        menu.setCache(menuAdd.getCache());
        menu.setComponent(menuAdd.getComponent());
        menu.setComponentName(menuAdd.getComponentName());
        menu.setHidden(menuAdd.getHidden());
        menu.setIcon(menuAdd.getIcon());
        menu.setIFrame(menuAdd.getIFrame());
        menu.setName(menuAdd.getName());
        menu.setPath(menuAdd.getPath());
        menu.setPermission(menuAdd.getPermission());
        menu.setPid(menuAdd.getPid());
        menu.setSort(menuAdd.getSort());
        menu.setType(menuAdd.getType());
        menuMapper.insert(menu);
        return ResponseEntity.buildSuccess();
    }

    /**
     * @方法描述: 修改菜单选项
     * @参数:
     * @返回值:
     * @创建人:
     * @创建时间:: 2021/3/19
     */
    @Override
    public ResponseEntity updateMenu(MenuUpd menuUpd) {
        Menu menu = new Menu();
        menu.setId(menuUpd.getId());
        menu.setCache(menuUpd.getCache());
        menu.setComponent(menuUpd.getComponent());
        menu.setComponentName(menuUpd.getComponentName());
        menu.setHidden(menuUpd.getHidden());
        menu.setIcon(menuUpd.getIcon());
        menu.setIFrame(menuUpd.getIFrame());
        menu.setName(menuUpd.getName());
        menu.setPath(menuUpd.getPath());
        menu.setPermission(menuUpd.getPermission());
        menu.setPid(menuUpd.getPid());
        menu.setSort(menuUpd.getSort());
        menu.setType(menuUpd.getType());
        menuMapper.updateById(menu);
        return ResponseEntity.buildSuccess();
    }




    @Override
    public MenuTreeVo findMenuTree() {
        List<MenuVo> all = menuMapper.findMenuTree();
        // 过滤出目录及菜单，转换成树结构
        List<MenuVo> list = all.stream().map(menu -> {
            MenuVo dto = new MenuVo();
            dto.setPid(menu.getPid());
            dto.setId(menu.getId());
            dto.setName(menu.getName());
            return dto;
        }).collect(Collectors.toList());
        all.clear();
        MenuTreeVo menuTreeVo = buildTree(list);
        return menuTreeVo;
    }


    /**
     * @方法描述: 菜单目录条件查询，并将其构造为树状
     * @参数:
     * @返回值:
     * @创建人:
     * @创建时间:: 2021/3/18
     */
    public static MenuTreeVo buildTree(List<MenuVo> menuVos) {
        List<MenuVo> trees = new ArrayList<>();
        Set<String> ids = new HashSet<>();
        menuVos.forEach(menuVo->{
            if (menuVo.getPid() == 0) {
                trees.add(menuVo);
            }
            for (MenuVo it : menuVos) {
                if (it.getPid().equals(menuVo.getId())) {
                    if (menuVo.getChildren() == null) {
                        menuVo.setChildren(new ArrayList<>());
                    }
                    menuVo.getChildren().add(it);
                    ids.add(it.getId().toString());
                }
            }
        });
        MenuTreeVo menuTreeVo = new MenuTreeVo();
        menuTreeVo.setMenuTree(trees);
        if(menuVos != null && menuVos.size() > 0){
            menuTreeVo.setMenuSize(menuVos.size());
        }else{
            menuTreeVo.setMenuSize(0);
        }
        return menuTreeVo;
    }
}
